λŒ€μ²΄ 콩이 뭐야?

빈(Bean)?

μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬μ—μ„œ κ΄€λ¦¬ν•˜λŠ” 객체λ₯Ό μ˜λ―Έν•˜λŠ” μš©μ–΄

μŠ€ν”„λ§μ€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ‚΄μ—μ„œ 객체의 생λͺ… 주기와 μ˜μ‘΄μ„±μ„ κ΄€λ¦¬ν•˜λŠ”λ°, μ΄λŸ¬ν•œ 객체λ₯Ό 빈이라고 λΆ€λ₯Έλ‹€. λΉˆμ€ μŠ€ν”„λ§ IoC μ»¨ν…Œμ΄λ„ˆμ— μ˜ν•΄ μƒμ„±λ˜κ³  κ΄€λ¦¬λ˜λ©°, μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ—¬λŸ¬ κ³³μ—μ„œ ν•„μš”μ— 따라 μ£Όμž…λœλ‹€.

< IoC Container = DI container, βŠ‚ Bean Container >

IoC μ»¨ν…Œμ΄λ„ˆ - DI, Event Listener : μ–΄λ–€ μ΄λ²€νŠΈκ°€ λ²Œμ–΄μ‘Œμ„ λ•Œ λ°˜μ‘ν•˜λŠ” λ©”μ†Œλ“œ

…근데 μ™œ ν•˜ν•„ 콩?

빈의 νŠΉμ§•

  • μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆμ— μ˜ν•΄ 관리: λΉˆμ€ μŠ€ν”„λ§μ΄ μƒμ„±ν•˜κ³  κ΄€λ¦¬ν•˜λŠ” κ°μ²΄μž„. κ°œλ°œμžκ°€ λΉˆμ„ 직접 μƒμ„±ν•˜λŠ” 것이 μ•„λ‹ˆλΌ, μŠ€ν”„λ§μ΄ ν•„μš”ν•  λ•Œ λΉˆμ„ μžλ™μœΌλ‘œ μƒμ„±ν•˜κ³ , 빈 κ°„μ˜ μ˜μ‘΄μ„±λ„ μžλ™μœΌλ‘œ μ²˜λ¦¬ν•¨
  • 싱글톀 κΈ°λ³Έ μŠ€μ½”ν”„: μŠ€ν”„λ§μ—μ„œλŠ” 기본적으둜 빈이 μ‹±κΈ€ν†€μœΌλ‘œ 관리됨. 즉, λ™μΌν•œ λΉˆμ€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ‚΄μ—μ„œ ν•˜λ‚˜μ˜ μΈμŠ€ν„΄μŠ€λ§Œ μ‘΄μž¬ν•¨. λ‹€λ§Œ, ν•„μš”μ— 따라 ν”„λ‘œν† νƒ€μž… μŠ€μ½”ν”„λ₯Ό μ‚¬μš©ν•˜μ—¬ 맀번 μƒˆλ‘œμš΄ 객체λ₯Ό 생성할 수 있음
  • 생λͺ… μ£ΌκΈ°: λΉˆμ€ μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆκ°€ μ‹œμž‘λ  λ•Œ μƒμ„±λ˜κ³ , μ»¨ν…Œμ΄λ„ˆκ°€ μ’…λ£Œλ  λ•Œ μ†Œλ©Έν•¨. μŠ€ν”„λ§μ€ 빈의 생성, μ΄ˆκΈ°ν™”, μ˜μ‘΄μ„± μ£Όμž…, μ†Œλ©Έ λ“± 객체의 전체 생λͺ… μ£ΌκΈ°λ₯Ό 관리함

빈 μ •μ˜ 방법

  1. XML μ„€μ • νŒŒμΌμ—μ„œ 빈 μ •μ˜: 전톡적인 방식

    μŠ€ν¬λ¦°μƒ· 2024-10-01 13-32-12.png

  2. μžλ°” μ–΄λ…Έν…Œμ΄μ…˜μœΌλ‘œ 빈 μ •μ˜: μŠ€ν”„λ§μ—μ„œλŠ” μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•΄ λΉˆμ„ μ •μ˜ν•˜λŠ” 방식이 더 μΌλ°˜μ μ΄λ‹€. 주둜 @Component, @Service, @Repository, @Controller μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•¨. 이 μ–΄λ…Έν…Œμ΄μ…˜μ΄ 뢙은 ν΄λž˜μŠ€λŠ” μŠ€ν”„λ§μ΄ μžλ™μœΌλ‘œ 빈으둜 λ“±λ‘ν•œλ‹€.

    μŠ€ν¬λ¦°μƒ· 2024-10-01 13-34-23.png

  3. @Configurationκ³Ό @Bean을 μ‚¬μš©ν•œ 빈 μ •μ˜: κ°œλ°œμžκ°€ νŠΉμ • λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•΄ 직접 λΉˆμ„ μƒμ„±ν•˜κ³  싢을 λ•Œ, @Configuration 클래슀 λ‚΄μ—μ„œ @Bean을 μ‚¬μš©ν•˜μ—¬ λΉˆμ„ μ •μ˜ν•  수 있음

    μŠ€ν¬λ¦°μƒ· 2024-10-01 13-36-12.png

빈의 μŠ€μ½”ν”„(Bean Scopes)

μŠ€ν”„λ§μ—μ„œλŠ” 빈이 μ–΄λ–€ λ²”μœ„(scope)μ—μ„œ 관리될지λ₯Ό 지정할 수 μžˆλ‹€. λŒ€ν‘œμ μΈ 빈의 μŠ€μ½”ν”„λŠ” λ‹€μŒκ³Ό κ°™λ‹€:

  • 싱글톀 : κΈ°λ³Έ μŠ€μ½”ν”„λ‘œ, ν•˜λ‚˜μ˜ 빈 μΈμŠ€ν„΄μŠ€κ°€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ „μ²΄μ—μ„œ 곡유됨
  • ν”„λ‘œν† νƒ€μž… : μš”μ²­μ΄ μžˆμ„ λ•Œλ§ˆλ‹€ μƒˆλ‘œμš΄ 빈 μΈμŠ€ν„΄μŠ€λ₯Ό 생성함
  • Request : μ›Ή μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ 각 HTTP μš”μ²­λ§ˆλ‹€ μƒˆλ‘œμš΄ λΉˆμ„ 생성함
  • Session : 각 HTTP μ„Έμ…˜λ§ˆλ‹€ ν•˜λ‚˜μ˜ λΉˆμ„ μƒμ„±ν•˜κ³ , μ„Έμ…˜μ΄ μ’…λ£Œλ  λ•Œ μ†Œλ©Έλ¨

\

빈 생성 μ •μ±… - scope 속성에 빈의 생성 정책을 지정할 수 μžˆλ‹€.

=> singleton: ν•œ 개의 객체만 생성. μ§€μ •ν•˜μ§€ μ•ŠμœΌλ©΄ 기본이 singleton이닀.

=> prototype: getBean() ν˜ΈμΆœν•  λ•Œλ§ˆλ‹€ 생성

=> request: (μ›Ή) μš”μ²­μ΄ λ“€μ–΄μ˜¬ λ•Œλ§ˆλ‹€ 생성

=> session: (μ›Ή) μ„Έμ…˜μ΄ 생성될 λ•Œλ§ˆλ‹€ 생성

=> application: (μ›Ή) μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹œμž‘ν•  λ•Œ 생성

=> websocket: (μ›Ή) μ›Ήμ†ŒμΌ“μ΄ 연결될 λ•Œ 생성*

\

Prototype 객체

getBean()을 ν˜ΈμΆœν•  λ•Œ λ§ˆλ‹€ μƒˆ 객체λ₯Ό λ§Œλ“€μ–΄ λ¦¬ν„΄ν•œλ‹€
νŠΉλ³„ν•œ κ²½μš°κ°€ μ•„λ‹ˆλ©΄ 이 방식을 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”λ‹€
μ™œ? 객체가 계속 μƒμ„±λ˜κΈ° λ•Œλ¬Έμ— 가비지가 많이 λ°œμƒν•  수 μžˆλ‹€

=> κ·Έλž˜μ„œ IoC μ»¨ν…Œμ΄λ„ˆλŠ” 기본으둜 singleton 방식을 μ‚¬μš©ν•œλ‹€


빈 μ‚¬μš© μ˜ˆμ‹œ

μŠ€ν¬λ¦°μƒ· 2024-10-01 15-11-25.png

μœ„ μ˜ˆμ‹œμ—μ„œ UserService와 UserRepositoryλŠ” μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆμ— μ˜ν•΄ 빈으둜 κ΄€λ¦¬λ˜κ³ , **μ˜μ‘΄μ„± μ£Όμž…(DI)**λ₯Ό 톡해 μ„œλ‘œ 연결됨. UserServiceλŠ” UserRepositoryλ₯Ό μ˜μ‘΄μ„±μœΌλ‘œ 가지며, μŠ€ν”„λ§μ΄ μžλ™μœΌλ‘œ λΉˆμ„ μƒμ„±ν•˜κ³  μ£Όμž…ν•¨~


⏳ νƒˆμΆœ <-